#include <iostream>
#include <string>
#include <typeinfo>
// using namespace std;


// 类模板对象作函数参数

template<typename NameType, typename AgeType>
class Person
{
public:
    Person(NameType name, AgeType age)
    {
        this->m_Name = name;
        this->m_Age  = age;
    }

    void showPerson()
    {
        std::cout << "姓名：" << this->m_Name << " 年龄：" << this->m_Age << std::endl;
    }

    NameType m_Name;
    AgeType  m_Age;
};

// 1、指定传入的类型
void printPerson1(Person<std::string, int>&p)
{
    p.showPerson();
}


void test01()
{
    Person<std::string, int>p("孙悟空", 100);
    printPerson1(p);
}
// 2、参数模板化
template<typename NameType, typename AgeType>
void printPerson2(Person<NameType, AgeType>&p)
{
    p.showPerson();
    std::cout << "NameType 的类型为：" << typeid(NameType).name() << std::endl;
    std::cout << "AgeType 的类型为：" << typeid(AgeType).name() << std::endl;
}

void test02()
{
    Person<std::string, int>p("猪八戒", 1000);
    printPerson2(p);
}

// 3、整个类模板化
template<class T>
void printPerson3(T &p)
{
    p.showPerson();
    std::cout << "T 的类型为：" << typeid(T).name() << std::endl;
}

void test03()
{
    Person<std::string, int>p("唐僧", 30);
    printPerson3(p);
}


int main()
{
    test01();
    test02();
    test03();
    return 0;
}